<?php
use Think\Model;

/* sqlite定义 */
define(SQLITE_COLUMN_NAME_KEY, 'name');			//sqlite列名键
define(SQLITE_COLUMN_COMMENT_KEY, 'comment');			//sqlite列名键

/* mysql定义 */
define(MYSQL_COLUMN_NAME_KEY, 'column_name');	//mysql列名键
define(MYSQL_COLUMN_COMMENT_KEY, 'column_comment');	//mysql列名键

function func1(){
	echo 'this is func1';
}

/**
 * 获取表名列表
 * @return array
 */
function getTableNameList(){
	$dbType = C('DB_TYPE');
	$Model = new Model(); // 实例化一个model对象 没有对应任何数据表
	if($dbType == 'mysql' || $dbType == 'mysqli'){
		$dbName = C('DB_NAME');
		$result = Array();
		$tempArray = $Model->query("select table_name from information_schema.tables where table_schema='".$dbName."' and table_type='base table'");
		foreach($tempArray as $temp){
			$result[] = $temp['table_name'];
		}
		return $result;
	}else{ //sqlite
		$result = Array();
		$tempArray = $Model->query("select * from sqlite_master where type='table' order by name");
		foreach($tempArray as $temp){
			$result[] = $temp['name'];
		}
		return $result;
	} 
	$this->error('数据库类型不支持');
}

/**
 * 读取项目目录下的文件夹，供用户选择哪个才是module目录
 * @return array
 * @throws Exception
 */
function getModuleNameList(){
	$ignoreList = C('TPH_IGNORE_LIST');
	$ignoreList = $ignoreList ? $ignoreList : Array("Common","Runtime","TPH");	// 排除的模块
	$allFileList = getDirList(APP_PATH);
	return array_diff($allFileList, $ignoreList);
}

/**
 * 获取列名列表
 * @param $tableName
 * @return mixed
 */
function getTableInfoArray($tableName){
	$dbType = C('DB_TYPE');
	$Model = new Model(); // 实例化一个model对象 没有对应任何数据表
	if($dbType == 'mysql' || $dbType == 'mysqli'){
		$dbName = C('DB_NAME');
		$result = $Model->query("select * from information_schema.columns where table_schema='".$dbName."' and table_name='".C('DB_PREFIX').$tableName."'");
		return $result;
	}elseif(strpos($dbType, 'sqlite')){ //sqlite
		$result = $Model->query("pragma table_info (".C('DB_PREFIX').$tableName.")");
		return $result;
	} 
	$this->error('数据库类型不支持');
}

/**
 * 获取表信息
 * @param $tableName
 * @return mixed
 */
function getTableArray($tableName){
	$dbType = C('DB_TYPE');
	$Model = new Model(); // 实例化一个model对象 没有对应任何数据表
	if($dbType == 'mysql' || $dbType == 'mysqli'){
		$result = $Model->query("show table status like '".C('DB_PREFIX').$tableName."'");
		return @current($result);
	}elseif(strpos($dbType, 'sqlite')){ //sqlite
		$result = $Model->query("pragma table_info (".C('DB_PREFIX').$tableName.")");
		return $result;
	}
	$this->error('数据库类型不支持');
}


/**
 * 根据数据库类型获取列名键
 * @return mixed
 */
function getColumnNameKey(){
	$dbType = C('DB_TYPE');
	if($dbType == 'mysql' || $dbType == 'mysqli'){
		return MYSQL_COLUMN_NAME_KEY;
	}else{
		return SQLITE_COLUMN_NAME_KEY;
	}
}

/**
 * 根据数据库类型获取列注释
 * @return mixed
 */
function getColumnCommentKey(){
	$dbType = C('DB_TYPE');
	if($dbType == 'mysql' || $dbType == 'mysqli'){
		return MYSQL_COLUMN_COMMENT_KEY;
	}else{
		return SQLITE_COLUMN_COMMENT_KEY;
	}
}

/**
 * 仅获取目录列表
 * @param $directory
 * @param string $type	文件类型	dir, file, all[包含], link[快捷方式]
 * @param bool|false $isDot	是否显示./..
 * @return array
 * @throws Exception
 */
function getDirList($directory, $type="dir", $isDot=false){
	$files = array();        
	try {        
		$dir = new \DirectoryIterator($directory);        
	} catch (Exception $e) {        
		throw new Exception($directory . ' is not readable');        
	}
	foreach($dir as $file) {
		if(!$isDot && $file->isDot())	// !$isDot表示验证是否为./..情况
			continue;
		switch($type){
			case 'dir':
				if($file->isDir())
					$files[] = $file->getFileName();
				break;
			case 'file':
				if($file->isFile())
					$files[] = $file->getFileName();
				break;
			case 'all':
				$files[] = $file->getFileName();
				break;
			case 'link':
				if($file->isLink())
					$files[] = $file->getFileName();
				break;
			default:
				$files[] = $file->getFileName();
				break;
		}
	}
	return $files;  
}

//把带下划线的表名转换为驼峰命名（首字母大写）
function tableNameToModelName($tableName){
	$tempArray = explode('_', $tableName);
	$result = "";
	for($i = 0; $i < count($tempArray);$i++){
		$result .= ucfirst($tempArray[$i]);
	}
	return $result;
}

//把带下划线的列名转换为驼峰命名（首字母小写）
function columNameToVarName($columName){
	$tempArray = explode('_', $columName);
	$result = "";
	for($i = 0; $i < count($tempArray);$i++){
		$result .= ucfirst($tempArray[$i]);
	}
	return lcfirst($result);
}

/**
 * 写入文件
 * @param $file
 * @param $content
 * @return int

function writeFile($file, $content, $mode=766){
	$result = file_put_contents($file, $content);
	if(is_numeric($result)){
		return $result;
	}

	$filePath = dirname($file);
	mkdir($filePath, $mode, true);
	return file_put_contents($file, $content);
}
*/

/**
 * 获取控制器文件路径
 * @param $moduleName
 * @param $isFile
 * @return string
 */
function getControllerPath($moduleName, $tableName){
	$controllerPath = APP_PATH. tableNameToModelName($moduleName) . "/" . TPH_CONTROLLER_PATH;
	if($tableName){
		$controllerPath .= tableNameToModelName($tableName)."Controller.class.php";
	}
	return $controllerPath;
}

/**
 * 获取控制器文件路径
 * @param $moduleName
 * @param $isFile
 * @return string
 */
function getModelPath($moduleName, $tableName){
	$controllerPath = APP_PATH. tableNameToModelName($moduleName) . "/" . TPH_MODEL_PATH;
	if($tableName){
		$controllerPath .= tableNameToModelName($tableName)."Model.class.php";
	}
	return $controllerPath;
}


/**
 * 获取视图文件路径
 * @param $moduleName
 */
function getViewPath($moduleName, $tableName, $viewName){
	$viewPath = APP_PATH. tableNameToModelName($moduleName). "/" . TPH_VIEW_PATH . tableNameToModelName($tableName)."/";
	if($viewName){
		$viewPath .= $viewName.".html";
	}
	return $viewPath;
}

/**
 * 解析注释信息
 * 备注: 对应配置信息的文字描述
 * @param $columnCommentKey
 * @param $columnNameKey
 * @return mixed
 */
function disposColumnComment($columnCommentKey, $columnNameKey){
    $columnCommentKey = current(explode(':', $columnCommentKey));
    if(empty($columnCommentKey)){
        $columnCommentKey = C("COLUMN_COMMENT_LIST")[$columnNameKey];    // 获取默认字段, 默认解析列表
    }
    return $columnCommentKey;
}

/**
 * 解析匹配对应函数
 * 备注: 通过字段名信息匹配对应的函数, 同时通过备注信息判断是否使用这个函数和对应的参数
 * @param $columnNameKey
 */
function disposColumnFunction($columnCommentKey, $columnNameKey){
	$customFunction = strpos($columnCommentKey, '|') ? end(explode('|', $columnCommentKey)) : null;  // 处理函数参数
	if($customFunction){
		return $columnNameKey .'|'. $customFunction;
	}

	# 系统自动解析匹配对应函数
    $parameter = strpos($columnCommentKey, ';') ? end(explode(';', $columnCommentKey)) : null;  // 处理函数参数
    $functionList = C("COLUMN_FUNCTION_LIST");  // 处理函数列表
    foreach ($functionList as $key => $function) {  // $function函数名, $key对应关系字符串
        if ($parameter){ // 参数存在情况
            $parameter = eval("return $parameter ? true : false;") ? $parameter : false;
            if (!$parameter) // 无需处理函数情况
                continue;
            else
                $function = '|'.$function.'='.$parameter.',###';
        }else{  // 参数不存在情况
            $function = '|'.$function;
        }

        if (is_numeric(strpos($columnNameKey, $key))) {
//            FPC($columnNameKey . $function);
            return $columnNameKey . $function;
        }
    }
	# END-系统自动解析匹配对应函数
	return $columnNameKey;
}

/**
 * 解析匹配对应函数
 * @param $columnCommentKey
 * @param null $make
 * @param $action
 * @return string|void
 */
function disposColumnSpecialMark($columnCommentKey, $position, $make = 'hide')
{
	$isMke = is_numeric(strpos($columnCommentKey, "[$position]"));  // 标记是否存在
	if ($isMke && $make=='hide' && is_numeric(strpos($columnCommentKey, "[hide]"))) {
		return true;
	} else if ($isMke && $make=='type') {
		return true;
	}

	return false;
}


